package Reflect03;

import Reflect.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
反射获取成员方法并使用
 */
public class ReflectDemo03 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取Class对象
        Class<?> c = Class.forName("Reflect.Student");

        //Method[] getMethods()返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象，包括那些由类或接口和那些从超类和超接口继承的声明。
//        //Method[] getDeclaredMethods() 返回包含一个数组 方法对象反射的类或接口的所有声明的方法，通过此表示 类对象，包括公共，保护，默认（包）访问和私有方法，但不包括继承的方法。
//        Method[] methods = c.getMethods();
//        for (Method method:methods){
//            System.out.println(method);//输出所有的公共方法和继承的方法！！！
//        }
        Method[] methods1 = c.getDeclaredMethods();
        for (Method method:methods1){
            System.out.println(method);//输出所有的私有方法!!!
        }
        System.out.println("--------");

        //Method getMethod(String name, 类<?>... parameterTypes)返回一个 方法对象，它反映此表示的类或接口的指定公共成员方法 类对象
        //Method getDeclaredMethod(String name, 类<?>... parameterTypes)返回一个 方法对象，它反映此表示的类或接口的指定声明的方法 类对象。
        //    public void method1(){
        Method m = c.getMethod("method1");

        //获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        //A 方法提供有关类和接口上单一方法的信息和访问权限。
        //invoke(Object obj, Object... args) 在具有指定参数的 方法对象上调用此 方法对象表示的底层方法。
        //Object是返回值类型
        //obj：调用方法的对象
        //args：方法需要的参数
        m.invoke(obj);








//        Student s=new Student();
//        s.method1();



    }
}
